package edu.ynu.se.xiecheng.achitectureclass.common.service;

import edu.ynu.se.xiecheng.achitectureclass.common.entity.User;
import edu.ynu.se.xiecheng.achitectureclass.common.repository.ImageRepository;
import edu.ynu.se.xiecheng.achitectureclass.common.repository.UserRepository;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RestTemplate restTemplate; // 用于发送请求

    // 注册用户功能
    public String registerUser(String u_id, String u_password) {
        // 检查用户是否已存在
        if (userRepository.findByUId(u_id) != null) {
            return "用户ID已存在";
        }

        // 创建新用户并保存到数据库
        User newUser = new User();
        newUser.setuId(u_id);
        newUser.setuPassword(u_password); // 直接存储密码
        userRepository.save(newUser);

        return "注册成功";
    }

    public String loginUser(String u_id, String u_password) {
        Map<String, Object> response = new HashMap<>();
        User user = userRepository.findByUId(u_id);

        if (user == null) {
            response.put("message", "用户不存在");
            return response.toString();  // 返回 JSON 格式的错误信息
        }

        // 验证密码
        if (user.getuPassword().equals(u_password)) {
            // 登录成功，获取并存储 FBox access_token
            String accessToken = getFBoxAccessToken();
            String cloudToken = getYSCloudAccessToken();

            if (accessToken != null) {
                user.setAccessToken(accessToken);
                userRepository.save(user);  // 保存 token 到数据库
            }

            if (cloudToken != null) {
                user.setCloudToken(cloudToken);
                userRepository.save(user);  // 保存 token 到数据库
            }

            // 登录成功，返回用户id和token信息
            response.put("message", "登录成功");
            response.put("u_id", user.getuId());
            response.put("access_token", accessToken);
            response.put("cloud_token", cloudToken);

            return response.toString();  // 返回 JSON 格式的成功信息
        } else {
            response.put("message", "密码错误");
            return response.toString();  // 返回 JSON 格式的密码错误信息
        }
    }

    // 获取 FBox access_token
    public String getFBoxAccessToken() {
        // FBox 登录接口 URL
        String url = "https://fbox360.com/idserver/core/connect/token";

        // 请求参数
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("scope", "fbox");
        params.add("client_id", "68db2e8bda8d47b5b5db7eaf71c7dcdd"); // 使用提供的 client_id
        params.add("client_secret", "76dc724c95004acab25482d344dab407"); // 使用提供的 client_secret
        params.add("grant_type", "client_credentials");

        // 请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        // 创建请求实体
        HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);

        // 使用 RestTemplate 发送 POST 请求
        try {
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
            if (response.getStatusCode() == HttpStatus.OK) {
                // 解析响应，获取 access_token
                String responseBody = response.getBody();
                if (responseBody != null) {
                    // 假设使用简单的字符串提取方法，实际应该使用 JSON 解析库 (如 Jackson)
                    int startIndex = responseBody.indexOf("\"access_token\":\"") + 16;
                    int endIndex = responseBody.indexOf("\"", startIndex);
                    return responseBody.substring(startIndex, endIndex);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    // 获取萤石云访问token并存储到数据库
    public String getYSCloudAccessToken() {
        // 定义萤石云登录接口 URL
        String url = "http://42.193.14.241:7000/ysapi/subAccount/getToken";
        String accountId ="1ca7f0ab24ba41b291346347ec30140e";

        // 请求参数
        String jsonRequest = "{\"accountId\": \"" + accountId + "\"}";

        // 请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 创建请求实体
        HttpEntity<String> entity = new HttpEntity<>(jsonRequest, headers);

        // 使用 RestTemplate 发送 POST 请求
        try {
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

            if (response.getStatusCode() == HttpStatus.OK) {
                // 解析响应，获取 access_token
                String responseBody = response.getBody();
                if (responseBody != null) {
                    // 使用 JSON 解析库解析返回的JSON
                    JSONObject jsonResponse = new JSONObject(responseBody);
                    if ("200".equals(jsonResponse.getString("code"))) {
                        String accessToken = jsonResponse.getJSONObject("data").getString("accessToken");
                        return accessToken; // 返回获取的token
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null; // 如果没有获取成功，则返回null
    }

}
